﻿using ConsoleApp.TestFunc.Interface;
using ConsoleApp.TestFunc.Service;
using Microsoft.Extensions.DependencyInjection;

namespace ConsoleApp.TestFunc.测试代码
{
    public static class DITest1
    {
        internal class Car
        {
            private readonly IBattery _battery;
            public Car(IBattery battery)
            {
                _battery = battery;
            }
            public void Start()
            {
                _battery.Supply(2);
            }
        }


        public static void Run()
        {
            ServiceCollection containerBuilder = new ServiceCollection();

            //服务描述 ServiceDescriptor descriptor:
            //1、服务的类型
            //2、服务的实现类型
            //3、服务的生命周期 transient singleton scoped

            //单例每次调用都是同一个服务
            //作用域 session会话在一个会话里面，scoped是同一个服务
            //瞬时服务，每一次调用，都是一个新的对象


            //注册容器里的服务信息
            containerBuilder.AddSingleton<Car>();
            containerBuilder.AddTransient<IBattery, BatteryB>();
            containerBuilder.AddScoped<IBattery, BatteryA>();

            //生成我们的容器
            IServiceProvider container = containerBuilder.BuildServiceProvider();
            containerBuilder.MakeReadOnly();


            // 获取所有 IBattery 实现
            IEnumerable<IBattery> batteries = container.GetServices<IBattery>();

            foreach (var battery in batteries)
            {
                Console.WriteLine(battery.GetCapacity()); // 调用每个实现的方法
            }
            //通过容器进行服务的调用
            Car? car = container.GetService<Car>();


            Console.WriteLine(car);
        }
    }
}
